package com.example.forum.services;

import com.example.forum.model.Article;
import org.apache.ibatis.annotations.Param;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;
import java.util.Map;

public interface IArticleService {
    /**
     * 发布帖子
     * @param article  要发布的帖子
     */
    @Transactional  //开启事务 保证三个操作同时完成或者失败
    void create(Article article);


    /**
     * 查询所有帖子
     * @return
     */
    List<Article> selectAll();

    /**
     * 查询所有帖子（带用户信息）
     * @return 带用户信息的帖子列表
     */
    List<Article> selectAllWithUserInfo();

    /**
     * 根据板块id查询该板块未被删除的所有文章
     * @param boardId 板块id
     * @return
     */
    List<Article> getAllByBoardId(Long boardId);

    /**
     * 根据板块id查询该板块未被删除的所有文章（带用户信息）
     * @param boardId 板块id
     * @return 带用户信息的文章列表
     */
    List<Article> getAllByBoardIdWithInfo(Long boardId);

    /**
     * 根据文章id 查询文章详情 (有很多额外查询的的字段)
     * @param id 文章id
     * @return
     */
    Article selectDetailById( Long id);

    /**
     * 增加文章访问次数
     * @param id 文章id
     */
    void incrementVisitCount(Long id);

    /**
     * 根据用户id查询用户的文章（带分页）
     * @param userId 用户ID
     * @param page 页码（从1开始）
     * @param size 每页大小
     * @return 分页后的文章列表
     */
    List<Article> selectByUserId(Long userId, Integer page, Integer size);
    
    /**
     * 统计用户的文章总数
     * @param userId 用户ID
     * @return 该用户的文章总数
     */
    int countUserArticles(Long userId);

    /**
     * 根据传入的id 修改帖子标题和正文
     * @param id   帖子id
     * @param title  帖子标签
     * @param content  帖子正文
     * @param tags 文章标签
     * @param summary 文章摘要
     */
    void modify(Long id, String title, String content, String tags, String summary);

    /**
     * 修改文章(包括板块)
     * @param id 文章id
     * @param title 文章标题
     * @param content 文章内容
     * @param boardId 新的板块id
     * @param tags 文章标签
     * @param summary 文章摘要
     */
    void modifyWithBoard(Long id, String title, String content, Long boardId, String tags, String summary);

    /**
     * 根据文章id 查询文章详情
     * @param id 文章id
     * @return
     */
    Article selectById(Long id);



    /**
     * 根据文章id 给点赞字段+1
     * @param id 文章id
     */
    void thumbsUpById(Long id);

    /**
     * 根据文章id 给点赞字段-1（取消点赞）
     * @param id 文章id
     */
    void cancelThumbsUpById(Long id);

    /**
     * 根据帖子id  删除帖子 将文章删除字段设置为1
     * 加上事务 使得 板块帖子-1 和用户帖子-1 保证同时成功或者失败
     * @param id  帖子id
     * @return
     */
    @Transactional  //事务管理
    void deleteById(Long id);

    /**
     * 帖子的回复数 +1
     * @param id
     */
    void addOneReplyCountById(Long id);

    /**
     * 获取所有文章（管理功能）
     * @return 所有未删除的文章
     */
    List<Article> getAllArticles();
    
    /**
     * 管理员修改文章状态
     * @param articleId 文章ID
     * @param state 状态(0正常, 1禁用)
     */
    void updateArticleState(Long articleId, Byte state);
    
    /**
     * 管理员通过ID删除文章（不校验作者ID），删除回复，并减少用户文章计数
     * @param articleId 文章ID
     */
    @Transactional
    void adminDeleteArticle(Long articleId);
    
    /**
     * 统计总文章数（未删除的）
     * @return 文章总数
     */
    int countTotalArticles();
    
    /**
     * 统计今日新增文章数
     * @return 今日新增文章数
     */
    int countTodayNewArticles();
    
    /**
     * 分页获取文章列表（管理功能）
     * @param page 页码
     * @param size 每页大小
     * @param keyword 搜索关键词
     * @param status 文章状态
     * @param sort 排序字段
     * @param order 排序方向
     * @return 包含文章列表和总数的Map
     */
    Map<String, Object> getArticlesByPage(int page, int size, String keyword, String status, String sort, String order);
    
    /**
     * 更新文章置顶状态
     * @param articleId 文章ID
     * @param isPinned 是否置顶(1置顶, 0取消置顶)
     */
    void updateArticlePinState(Long articleId, Byte isPinned);
}
